package entradaSaida;

import java.text.DecimalFormat;

import simulacao.Jogador;
import simulacao.Jogo;
import simulacao.TabelaPayoffs;
import estrategias.EstrategiaSempreCooperar;
import estrategias.EstrategiaTitForTat;

public class Main {

	public static void main(String[] args) {

		int numSimulacoes = 100000;
		double var = 0.5;
		simularJogo(construirJogo(), numSimulacoes, var);
	}
	
	public static Jogo construirJogo(){
		Jogo jogo = new Jogo();
		
		jogo.setP(0.05);
		jogo.setTaxaJuros(0.0017);
		
		Jogador j1 = new Jogador();
		j1.setEstrategia(new EstrategiaSempreCooperar());
		j1.setpSeEnganar(0.25);
		jogo.addJogador(j1);
		
		Jogador j2 = new Jogador();
		j2.setEstrategia(new EstrategiaTitForTat());
		j2.setpSeEnganar(0.0);
		jogo.addJogador(j2);
		
		EscritorArquivo arq = null;
		try {
			arq = new EscritorPlanilha(false);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		jogo.setEscritorArquivo(arq);
		jogo.setSalvarSaida(true);
		jogo.setPlanilha(true);
		
		TabelaPayoffs.getInstance().selecionarTabela(4);
		
		return jogo;
	}
	
	
	public static void simularJogo(Jogo jogo, int numSimulacoes, double var){
		
		double[] payoffMedio;
		EscritorTxt txt;
		DecimalFormat decimalFormat = new DecimalFormat("0.00");
		int index = (int) (var*numSimulacoes)-1;
		index = index == -1 ? 0 : index;
		Jogador jogador1 = jogo.getJogador(0);
		Jogador jogador2 = jogo.getJogador(1);
		EscritorArquivo arq = jogo.getEscritorArquivo();
		
		payoffMedio = jogo.simular(numSimulacoes);
		
		System.out.println("Simulação executada em "+(int)payoffMedio[0]+" s");
		
		String resultado = "p = "+jogo.getP()+" \tjuros = "+jogo.getTaxaJuros();
		resultado+="\n----------------------------------------------------------------\n";
		resultado+="A estratégia do jogador 1 é " + jogador1.getEstrategia().getNome() + ".\n" +
				"Ele COOPERA "+decimalFormat.format(jogador1.getDistribuicaoJogadas(0))+
				"% das vezes e OBSTA "+ decimalFormat.format(jogador1.getDistribuicaoJogadas(1))+"% das vezes\n";
		resultado+="O payoff esperado médio para o jogador 1 é "+ decimalFormat.format(payoffMedio[1])+".\n";
		resultado+="O Value at Risk num percentil de "+decimalFormat.format(100*var)+"% é de "+ decimalFormat.format(jogador1.getVar(index))+".";
		resultado+="\n----------------------------------------------------------------\n";
		resultado+="A estratégia do jogador 2 é " + jogador2.getEstrategia().getNome() + ".\n" +
				"Ele COOPERA "+decimalFormat.format(jogador2.getDistribuicaoJogadas(0))+
				"% das vezes OBSTA "+ decimalFormat.format(jogador2.getDistribuicaoJogadas(1))+"% das vezes\n";
		resultado+="O payoff esperado médio para o jogador 2 é "+ decimalFormat.format(payoffMedio[2])+".\n";
		resultado+="O Value at Risk num percentil de "+decimalFormat.format(100*var)+"% é de "+ decimalFormat.format(jogador2.getVar(index))+".";
		
		System.out.println(resultado);
		
		try {
			txt = new EscritorTxt(arq.getCaminhoArquivo().replace(".xls", ".txt"));
			txt.escreverNoArquivo(resultado);
			txt.fecharArquivo();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


